import { FormInstance, TableInstance } from "element-plus"
import { PageQuery } from "types/pageQuery"
import { Ref } from "vue"
import type Node from "element-plus/es/components/tree/src/model/node"
import { Dictionary } from "@/api/system-api/dictionary/types/dictionary"
import { TreeInstance } from "element-plus/lib/components/index.js"
/**
 * el-table需要用到的所有方法模型
 */
export interface TableData<TQuery extends PageQuery, TResult> {
  /**
   * el-table整体响应对象
   */
  tableRef: Ref<TableInstance>
  /**
   * el-table loading响应对象
   */
  tableLoadingRef: Ref<boolean>
  /**
   * 查询实体响应对象
   */
  queryRef: Ref<TQuery>
  /**
   * 重置query的方法(重置成初始值)
   * @returns
   */
  resetQuery: () => void
  /**
   * 列表响应对象
   */
  tableDataRef: Ref<TResult[] | undefined>
  /**
   * 分页组件总条数响应对象
   */
  totalRef: Ref<number>
  /**
   * 更新tableData的方法
   * @returns
   */
  getList: () => Promise<void>
  /**
   * 分页方法
   * @param val
   * @returns
   */
  handleSizeChange: (val: number) => Promise<void>
  /**
   * 分页方法
   * @param val
   * @returns
   */
  handleCurrentChange: (val: number) => Promise<void>
}
/**
 * 懒加载el-table所用到的对象模型
 */
export interface TableTreeData<TQuery extends PageQuery, TResult> extends TableData<TQuery, TResult> {
  /**
   * 树形table懒加载方法
   * @param row 当前row
   * @param treeNode 当前treeNode
   * @param resolve 获取数据调用此方法渲染
   * @returns
   */
  load(row: TResult, treeNode: any, resolve: (data: TResult[]) => void): Promise<void>
  /**
   * 树形表重新加载的方法
   * @param key
   * @returns
   */
  reload: (row?: TResult) => Promise<void>
}

/**
 * 弹窗表单接口
 */
export interface DialogData<TEntity> {
  /**
   * el-form表单实例
   */
  formRef: Ref<FormInstance>
  /**
   * 表单值响应对象
   */
  entityRef: Ref<TEntity>
  /**
   * dialog显示响应对象
   */
  dialogStatus: Ref<boolean>
  /**
   * 当前dialog窗口的业务状态 初始值0 1新增 2修改 3详情
   */
  currentRef: Ref<0 | 1 | 2 | 3>
  /**
   * 获取当前弹窗状态中文名
   * @returns
   */
  getCurrent: () => string
  /**
   * 处理创建新数据表单的处理方法
   */
  handleCreate(): Promise<void>
  /**
   * 处理修改列表数据的处理方法
   * @param entity table内row的数据
   */
  handleUpdate(entity: TEntity): Promise<void>
  /**
   * 处理删除列表内数据的方法
   * @param entity table内row的数据
   */
  handleDelete(entity: TEntity): Promise<void>
  /**
   * 处理点开详情时的方法
   * @param entity
   */
  handleDetail(entity: TEntity): void
  /**
   * 处理保存表单数据内的方法(内部处理逻辑为根据currentRef的值来调用不同的api 1时调用新增 2时调用修改 其他状态不调用)
   */
  submit(): Promise<void>
}
/**
 * el-treeSelect所有需要的属性
 */
export interface TreeSelectData<T> {
  /**
   * tree下拉的响应式数组
   */
  optionsRef: Ref<T[]>
  /**
   * el-tree组件实例
   */
  treeRef: Ref<TreeInstance>
  /**
   * 更新tree元素的方法
   */
  getTree(): Promise<void>
  /**
   * 树形组件懒加载的方法
   * @param node 当前节点node
   * @param resolve 成功获取数据时执行的委托
   * @param reject 失败是执行的委托(可以保证加载状态不会改变)
   */
  treeLoad(node: Node, resolve: (data: T[]) => void, reject: () => void): Promise<void>
}
/**
 * 字典option模型
 */
export interface DictionaryOptions {
  /**
   * 响应式option数据
   */
  optionsRef: Ref<Dictionary[]>
  /**
   * 更新字典options的方法
   * @returns
   */
  getOptions: () => Promise<void>
}
